\documentclass{beamer}

\usetheme{Frankfurt}

\usepackage[czech]{babel}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{graphicx}

% Pomucky pro spravnou sazbu URL
\def\urltilda{\kern -.15em\lower .7ex\hbox{\~{}}\kern .04em}
\def\urldot{\kern -.10em.\kern -.10em}
\def\urlhttp{http\kern -.10em\lower -.1ex\hbox{:}\kern -.12em\lower 0ex\hbox{/}\kern -.18em\lower 0ex\hbox{/}}

\title{Základy Qt4}
\author{Marek Hakala \& Michal Rost}
\institute[SH]{
  Akademie C++ 
  \and
  SH ČVUT
}
\date{3. lekce}

\begin{document}

\begin{frame}
  \titlepage
\end{frame}

\begin{frame}{Osnova}
  \tableofcontents
\end{frame}

\section{Objektový model Qt4}

\begin{frame}{Objektový model Qt4 - MOS}
  \begin{columns}
    \begin{column}[l]{5cm}
      \begin{block}{Meta Object System (MOS)}
        \begin{itemize}
          \item Umožňuje reflexi
          \item Umožňuje zasílání zpráv mezi objekty
          \item Součástí modulu \emph{QtCore}
          \item Základním pilířem třída \emph{QObject}
          \item Zpracováván pomocí \emph{Meta Object Compiler} (MOC)
        \end{itemize}
      \end{block}
    \end{column}
    \begin{column}[r]{6cm}
      \begin{figure}[htbp]
        \includegraphics[scale=0.5]{./resources/qt4_mos.pdf}
        \caption{Základní třídy v QtCore}
      \end{figure}
    \end{column}
  \end{columns}
\end{frame}

\begin{frame}{Objektový model Qt4 - MOC}
  \begin{block}{Meta Object Compiler (MOC)}
    \begin{itemize}
      \item Preprocesor
      \item Generuje metadata pro třídy MOS
    \end{itemize}
  \end{block}
  \vspace{1cm}
  \begin{figure}[htbp]
    \includegraphics[scale=0.575]{./resources/qt4_moc.pdf}
    \caption{Činnost MOC}
  \end{figure}
\end{frame}

\begin{frame}{QObject}
  \begin{columns}
    \begin{column}[l]{5cm}
    \begin{itemize}
      \item Základní pilíř MOS
      \item Potomkům zpřístupněna reflexe
      \item Instancím potomků jsou zpřístupněny signály a sloty
    \end{itemize}
    \end{column}
    \begin{column}[r]{6.5cm}
        \includegraphics[scale=0.62]{./resources/qt4_qobject.pdf}
    \end{column}
  \end{columns}
\end{frame}

\section{Reflexe}

\begin{frame}{QMetaObject}
  \begin{figure}[htbp]
    \includegraphics[scale=1.2]{./resources/qt4_qmetaobject.pdf}
    \caption{třída QMetaObject}
  \end{figure}
\end{frame}

\begin{frame}{QMetaMethod a QMetaProperty}
  \begin{figure}[htbp]
    \includegraphics[scale=1.1]{./resources/qt4_qmetamethod.pdf}
    \caption{třídy QMetaMethod a QMetaProperty}
  \end{figure}
\end{frame}

\begin{frame}[fragile]
  \frametitle{QMetaObject, QMetaMethod - použití}
  \begin{verbatim}
    const QMetaObject* mo = myClass->metaObject();

    qDebug() << mo->className() << endl;
    qDebug() << mo->superClass()->className() << endl;

    int id = mo->indexOfMethod("test()");
    QMetaMethod m = mo->method(id);
    m.invoke(myClass);
  \end{verbatim}
\end{frame}

\begin{frame}{QMetaType}
  \begin{block}{Vlastnosti QMetaType}
    \begin{itemize}
      \item Umožňuje vyhledat datový typ podle jeho jména
      \item Umožňuje vytvořit/zrušit instanci vyhledaného typu
      \item Datový typ \emph{NEMUSÍ BÝT POTOMKEM} QObject
      \item Datový typ musí obsahovat \uv{konstruktor bez parametrů ()} a \uv{kopírovací konstruktor}
    \end{itemize}
  \end{block}
  \vspace{0.25cm}
  \begin{figure}[htbp]
    \includegraphics[scale=0.9]{./resources/qt4_qmetatype.pdf}
    \caption{Činnost MOC}
  \end{figure}
\end{frame}

\begin{frame}[fragile]
  \frametitle{QMetaType - použití}
  \begin{verbatim}
    Q_DECLARE_METATYPE(MyClass)
    qRegisterMetaType<MyClass>();

    ...

    int id = QMetaType::type("MyClass");
    if (id != 0) {
      void *myClassPtr = QMetaType::construct(id);
      QMetaType::destroy(id, myClassPtr);
      myClassPtr = 0;
    }
  \end{verbatim}
\end{frame}

\section{Signály a sloty}

\begin{frame}{Signály a sloty}
    \begin{itemize}
      \item Zajišťují komunikaci mezi objekty
      \item Vztah m : n
      \item Musí se shodovat v typu parametrů a jejich počtu
      \item Hojně využívány v GUI (nahrazují návrhový vzor Observer)
    \end{itemize}
\end{frame}

\begin{frame}{Inicializace signálů a slotů}
  \begin{figure}[htbp]
    \includegraphics[scale=0.60]{./resources/qt4_signalslot1.pdf}
    \caption{Schématický obrázek inicializace signálů a slotů}
  \end{figure}
\end{frame}

\begin{frame}{Použití signálů a slotů}
  \begin{figure}[htbp]
    \includegraphics[scale=0.71]{./resources/qt4_signalslot2.pdf}
    \caption{UML2 diagramy pro použití signálů a slotů}
  \end{figure}
\end{frame}

\end{document}
